package com.xinzhidi.common.utils;


import com.xinzhidi.common.model.TreeNode;
import lombok.experimental.UtilityClass;

import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import java.util.Map;
import java.util.function.Function;
import java.util.stream.Collectors;

@UtilityClass
public class TreeUtil {

    /**
     * 方法描述：两层循环实现建树
     *
     * @param treeNodes 传入数据列表
     * @return java.util.List<T>
     * @author cx
     * @date 2023/06/09
     */
    public <T extends TreeNode> List<T> buildTree(List<T> treeNodes) {
        // 将所有数据转换为Map结构，key为节点id value为
        Map<String, T> voMap =
                treeNodes.stream().collect(Collectors.toMap(T::getNodeId, Function.identity(), (key1, key2) -> key1));
        List<T> resultTreeList = new ArrayList<>();
        for (T treeNode : treeNodes) {
            String parentNodeId = treeNode.getParentNodeId();
            //如果是首节点就加入返回的集合中
            if (StringUtils.isBlank(parentNodeId) || "0_0".equals(parentNodeId)) {
                resultTreeList.add(treeNode);
            } else {
                // 获取当前节点的父级节点集合，默认只有一条
                T parentNode = voMap.get(treeNode.getParentNodeId());
                // 理论上只有一条
                if (parentNode != null) {
                    // 上级的子节点中加入该节点
                    parentNode.add(treeNode);
                } else {
                    // 如果当前节点在所有节点中没有父节点，则将它设置为根节点
                    resultTreeList.add(treeNode);
                }
            }
        }
        return resultTreeList;
    }

}
